package gestores;
import repositorio.DAOBanco;
import repositorio.DAOConsumo;
import repositorio.DAOEstadia;
import repositorio.DAOFactura;
import repositorio.DAOItempago;
import repositorio.DAOMediopago;
import repositorio.DAOMoneda;
import repositorio.DAOPaga;
import repositorio.DAOPago;
import repositorio.DAOResponsablepago;
import repositorio.DAOTarjetascredito;
import repositorio.DAOTarjetasdebito;
import logica.Banco;
import logica.Consumo;
import logica.Estadia;
import logica.Excepcion;
import logica.Factura;
import logica.ItemPagoAux;
import logica.Itempago;
import logica.Mediopago;
import logica.Moneda;
import logica.Paga;
import logica.Pago;
import logica.Pasajero;
import logica.Responsablepago;
import logica.Tarjetascredito;
import logica.Tarjetasdebito;

import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;

public class GestorPago {
	
	public void facturar (int id_estadia, Pasajero pasajero, Responsablepago resPago, String nombre, List<Integer> idConsumosSelec, String tipofactura, 
						double importeTotal, boolean bandera){
		
		Calendar fechaFacturacion = Calendar.getInstance();
		List<Consumo> consumosFacturar = new ArrayList<>();
		DAOEstadia daoEstadia = new DAOEstadia();
		DAOConsumo daoConsumo = new DAOConsumo();
		
		Factura factura = new Factura();
		Paga pagaFactura = new Paga();
		factura.setFechaFacturacion(fechaFacturacion);
		factura.setNombre(nombre);
		factura.setTipofactura(tipofactura);
		factura.setImporteTotal(importeTotal);
		factura.setEstadiaFacturada(bandera);

		Estadia estadia = daoEstadia.getById(id_estadia);
		if(estadia.getFacturas().isEmpty()){
			List<Factura> facturas = new ArrayList<Factura>();
			facturas.add(factura);
			estadia.setFacturas(facturas);
			factura.setEstadia(estadia);
		}
		else{
			estadia.addFactura(factura);
			factura.setEstadia(estadia);
		}
		for (int idConsumo : idConsumosSelec) {
			Consumo consumo = daoConsumo.getById(idConsumo);
			consumosFacturar.add(consumo);
			}
		factura.setConsumos(consumosFacturar);
		
		//set de quien es el responsable de pagar la habitacion.
		if (!(pasajero ==null)){
			pagaFactura.setPasajero(pasajero);
		}
		else{
			pagaFactura.setResponsablepago(resPago);
		
		}
		pagaFactura.setFactura(factura);
		
		factura.setPaga(pagaFactura);
		
		DAOFactura daofactura = new DAOFactura();
		daofactura.save(factura);
		
		DAOPaga daopaga = new DAOPaga();
		daopaga.save(pagaFactura);
	}


	public void ingresarPago(int idFactura, double importe, List<ItemPagoAux> listaItemsaux){
		
		Pago pago = new Pago();
		Calendar fechaPago = Calendar.getInstance();
		List<Itempago> listaItemsPago = new ArrayList<>();
		
		DAOFactura daofactura = new DAOFactura();
		Factura factura = daofactura.getById(idFactura);
		
		pago.setFechapago(fechaPago);
		pago.setFactura(factura);
		pago.setImporte(importe);
		

		DAOItempago dItem = new DAOItempago();
		
		for (ItemPagoAux itemaux : listaItemsaux) {
			
			DAOMediopago daomediopago = new DAOMediopago();
			Mediopago mediopago = daomediopago.getById(itemaux.getIdMediopago());
				
			Itempago itemPago = new Itempago();
			
			itemPago.setBanco(itemaux.getBanco());
			itemPago.setCotizacion(itemaux.getCotizacion());
			itemPago.setFechacobro(itemaux.getFechacobro());
			itemPago.setMoneda(itemaux.getMoneda());
			itemPago.setNrocheque(itemaux.getNrocheque());
			itemPago.setNrotarjeta(itemaux.getNroTarjeta());
			itemPago.setPlaza(itemaux.getPlaza());
			itemPago.setSubimporte(itemaux.getSubimporte());
			itemPago.setMediopago(mediopago);
			
			
			
			listaItemsPago.add(itemPago);
			
		}
		
		pago.setItempagos(listaItemsPago);
		DAOPago daopago = new DAOPago();
		daopago.save(pago);
		factura.setPago(pago);
		for(Itempago item : listaItemsPago){
			item.setPago(pago);
			dItem.save(item);
		}
		
		
				
	}


	public List<Factura> getFacturas(String nroHab){
		DAOFactura dFacturas = new DAOFactura();
		List<Factura> listaFacturas = new ArrayList<Factura>();
		List<Factura> todasFacturas = dFacturas.getAll();
		
		
	
		for(Factura fac : todasFacturas){
			
			if(fac.getEstadia().getHabitacion().getNrohabitacion().equals(nroHab)){
				if(fac.getPago()==null || (fac.getImporteTotal()-fac.getPago().getImporte())>0)
					listaFacturas.add(fac);
			}

		}
		return listaFacturas;
	}
	public List<Factura> getFacturas(int idEstadia){
		DAOFactura dFacturas = new DAOFactura();
		List<Factura> listaFacturas = new ArrayList<Factura>();
		List<Factura> todasFacturas = dFacturas.getAll();
		
	
		for(Factura fac : todasFacturas){
			
			if(fac.getEstadia().getIdEstadia()==idEstadia){
				if(fac.getPago()==null || (fac.getImporteTotal()-fac.getPago().getImporte())>0)
					listaFacturas.add(fac);
			}
		}
		return listaFacturas;
	}
	
	
	public Responsablepago darResponsablePago(String cuit) throws Excepcion{
		DAOResponsablepago daoresponsable = new DAOResponsablepago();
		List<Responsablepago> listaresponsables = daoresponsable.getAll();
		
		for (Responsablepago responsable : listaresponsables) {
			if (responsable.getCuitresponsable().equals(cuit))
				return responsable;
		}
		return null;

	}
	
	public List<Mediopago> getMediosPago(){
		DAOMediopago dMedio = new DAOMediopago();
		return dMedio.getAll();
	}
	public boolean isFacturada(int idEstadia){
		
		DAOEstadia daoEstadia = new DAOEstadia();
		Estadia e = daoEstadia.getById(idEstadia);
		List<Factura> facturas = e.getFacturas();
		List<Consumo> consumos = e.getConsumos();
		
		for(Consumo c: consumos){
			if(!(consumoFacturado(c.getProducto().getIdProducto(),facturas)))
				return false;
		}
		return estadiaFacturada(facturas);
		
		
	}
	public boolean estadiaFacturada(List<Factura> facturas){
		DAOFactura dFactura = new DAOFactura();
		for(Factura f: facturas){
			int id_f = f.getIdFactura();
			Factura factu= dFactura.getById(id_f);
			if(factu.isEstadiaFacturada())
				return true;
		}
		return false;
	}
	public boolean consumoFacturado(int idProducto,List<Factura> facturas){
		DAOFactura dFactura = new DAOFactura();
		for(Factura f: facturas){
			int id_f = f.getIdFactura();
			Factura factu= dFactura.getById(id_f);
			for(Consumo c: factu.getConsumos()){
				if(c.getProducto().getIdProducto()==idProducto)
					return true;
			}
		}
		return false;
	}
	public double calcularValorEstadia(int idEstadiaFacturar, Calendar horaSalida){
		DAOEstadia daoest = new DAOEstadia();
		Estadia estadiaFacturar=daoest.getById(idEstadiaFacturar);
		Calendar hoy = Calendar.getInstance();	
		Calendar fechaEntrada = estadiaFacturar.getFechaEntrada();
		int diasEstadia = 0;
		
		
		
		if(hoy.get(Calendar.YEAR) == fechaEntrada.get(Calendar.YEAR)){
			diasEstadia = hoy.get(Calendar.DAY_OF_YEAR) - fechaEntrada.get(Calendar.DAY_OF_YEAR);
			if(diasEstadia == 0) //quiere decir que estoy en el mismo dia que entro y salio y se computa un dia.
				diasEstadia =1;
		}		
		else{
			int diasAnoAnterior = 365 - fechaEntrada.get(Calendar.DAY_OF_YEAR);
			diasEstadia = hoy.get(Calendar.DAY_OF_YEAR) + diasAnoAnterior;
		}
		
		double precioHab = estadiaFacturar.getPrecio();
		double precioEstadia = diasEstadia*precioHab;
		int cantDias = estadiaFacturar.getCantidadDias();
		
		if(diasEstadia >= cantDias){
			double descuento = estadiaFacturar.getDescuento();
			precioEstadia -= (descuento/100)*precioEstadia;
		}
		int hora = horaSalida.get(Calendar.HOUR_OF_DAY);
		int minutos = horaSalida.get(Calendar.MINUTE);
		int dias = hoy.get(Calendar.DAY_OF_YEAR) - fechaEntrada.get(Calendar.DAY_OF_YEAR);
		if(hora == 11 && minutos == 0)
			precioEstadia += 0;
		else{
			if(hora >= 11 && !(dias==0)){
				precioEstadia += (precioHab/2);
			}	
		}
		
		if(hora == 18 && minutos == 0)
			precioEstadia += 0;
		else{
			if(hora >= 18 && !(dias==0)){
				precioEstadia += (precioHab/2);
			}	
		}	
		return precioEstadia;
	}

	public List<Consumo> consumosSinFacturar(int idEstadiaFacturar){
		DAOEstadia daoest = new DAOEstadia();
		Estadia estadiaFacturar=daoest.getById(idEstadiaFacturar);
		List<Consumo>consumos = estadiaFacturar.getConsumos();
		List<Consumo> consumosSinF = new ArrayList<Consumo>();
		List<Factura> facturas = getFacturas(estadiaFacturar.getIdEstadia());
		for(Consumo c: consumos){
			if(!(consumoFacturado(c.getProducto().getIdProducto(),facturas)))
				consumosSinF.add(c);
		}
		return consumosSinF;
	}
	public void estadiaFacturada(Calendar hora, int idEstadia){
		DAOEstadia daoEstadia = new DAOEstadia();
		Estadia estadia=daoEstadia.getById(idEstadia);
		estadia.setHoraSalida(hora);
		
		Calendar hoy = Calendar.getInstance();
		estadia.setFechaSalidareal(hoy);
		
		daoEstadia.update(estadia);
		
		
	}
	public String personaFiscal(int idFactura){
		DAOFactura daoFctura = new DAOFactura();
		String persona="";
		Factura f = daoFctura.getById(idFactura);
		if (!(f.getPaga().getResponsablepago()==null))
			persona=(f.getPaga().getResponsablepago().getRazonsocial());
		else
			persona=(f.getPaga().getPasajero().getApellido()+" "+f.getPaga().getPasajero().getNombre());
		return persona;
	}
	
	public List<Moneda> getMonedas(){
		DAOMoneda dMoneda = new DAOMoneda();
		return dMoneda.getAll();
	}
	public List<Banco> getBancos(){
		DAOBanco dBanco= new DAOBanco();
		return dBanco.getAll();
	}
	public List<Tarjetascredito> getTarjetasCredito(){
		DAOTarjetascredito dTarjeta= new DAOTarjetascredito();
		return dTarjeta.getAll();
	}
	public List<Tarjetasdebito> getTarjetasDebito(){
		DAOTarjetasdebito dTarjeta= new DAOTarjetasdebito();
		return dTarjeta.getAll();
	}
}